# Hárompoharas játék (Itt a piros, hol a piros)

import turtle
import random

# ---------------- Ablak ----------------
rajzlap = turtle.Screen()
rajzlap.title("Itt a piros, hol a piros")
rajzlap.tracer(0)              # Automatikus frissítés kikapcsolása
rajzlap.addshape("pohar.gif")  # Saját alak betöltése

# ---------------- Golyó ----------------
golyo = turtle.Turtle()
golyo.shape("circle")
golyo.color("red")
golyo.penup()
golyo.goto(0, 0)

# ---------------- Poharak ----------------
poharak = []

# Három pohár létrehozása
for _ in range(3):
    p = turtle.Turtle()
    p.penup()
    p.shape("pohar.gif")
    p.st()
    poharak.append(p)

# Kezdő pozíciók
poziciok = [-100, 0, 100]
for i in range(3):
    poharak[i].setx(poziciok[i])

rajzlap.update()

# A golyó kezdetben a középső pohár alatt van.
golyos_pohar = 1

def frissit_golyo():
    # A golyót mindig a megfelelő pohár alá helyezi.
    golyo.goto(poharak[golyos_pohar].xcor(), poharak[golyos_pohar].ycor())


def csere(i, j, callback=None):
    """
    Két pohár animált cseréje.
    i és j a poharak indexei.
    callback: a csere végén meghívandó függvény, ami elhagyható
    """
    # Az i-edik pohár célhelye legyen a j-edik pohár mostani helye
     
    # A j-edik pohár célhelye legyen az i-edik pohár mostani helye
    

    def emel():
        # A kiválasztott indexű poharakkal foglalkozunk
        ind=i
            # Ha még nem érte el a pohár a megfelelő magasságot, akkor emelekdjen 2 pixelt
            
                # Ha még nem értük el a kívánt magasságot, akkor még nem fejeződött be az emelkedés
                
                # Ha elértük a kívánt magasságot, akkor kész van ez a folyamat
                

        # Ha a golyos_pohar mozdult, akkor a pohár kövesse le a mozgását
       
        # A mozgások jelenjenek meg a képernyőn
        

        # Ha az emelkedés befejeződött, akkor meghívja a mozgat függvényt
        # Különben mégegyszer meghívja az emel függvényt 10 ms múlva         

    def mozgat():
        # Alapból a folyamatot késznek tekintjük és a nem kész eseteket később kezeljük 
        kesz=True

        # i. pohár mozgatása
        # Ha a jelenlegi x koordináta kisebb, mint a cél, akkor jobbra mozgatjuk és még nem vagyunk kész
        # Különben ha az x koordináta nagyobb, mint a cél, akkor balra mozgatjuk és még nem vagyunk kész
        if poharak[i].xcor() < cel_i:
            poharak[i].setx(poharak[i].xcor() + 2)
            kesz = False
        elif poharak[i].xcor() > cel_i:
            poharak[i].setx(poharak[i].xcor() - 2)
            kesz = False

        # j. pohár mozgatása
        # Ha a jelenlegi x koordináta kisebb, mint a cél, akkor jobbra mozgatjuk és még nem vagyunk kész
        # Különben ha az x koordináta nagyobb, mint a cél, akkor balra mozgatjuk és még nem vagyunk kész
        

        # Ha a golyos_pohar mozdult, akkor a pohár kövesse le a mozgását
        frissit_golyo()
        # A mozgások jelenjenek meg a képernyőn
        rajzlap.update()

        # Ha a mozgás befejeződött, akkor meghívja a leenged függvényt
        # Különben mégegyszer meghívja a mozgat függvényt 10 ms múlva
        if kesz:
            leenged()
        else:
            rajzlap.ontimer(mozgat, 10)

    def leenged():
        # A csere függvény callback függvényét akarom használni
        nonlocal callback
        # Alapból a folyamatot késznek tekintjük és a nem kész eseteket később kezeljük 
        kesz = True
        # A kiválasztott indexű poharakkal foglalkozunk
        for ind in (i, j):
            # Ha még nem érte el a pohár a megfelelő magasságot, akkor ereszkedjen 2 pixelt
            if poharak[ind].ycor() > 0:
                poharak[ind].sety(poharak[ind].ycor() - 2)
                kesz = False

        # Ha a golyos_pohar mozdult, akkor a pohár kövesse le a mozgását
        frissit_golyo()
        # A mozgások jelenjenek meg a képernyőn
        rajzlap.update()

        # Ha kész vagyunk és van megadva callback függvény a csere paraméterének, akkor hívjuk meg ezt a függvényt
        # Különben folytassuk a leengedést
        
    # Elindítjuk az emelkedést, a többi függvény pedig a megfelelő helyeken fog elindulni
    

# Lehetséges cserék:


# Következő csere pár kiválasztása, ha még kell
def kovetkezo(db):
    # Ha db = 0 álljon le
    if db == 0:
        return
    # Véletlenszerűen válasszunk egy párt a parok közül
    i, j = random.choice(parok)
    # Cseréljük meg a kiválasztott poharakat, majd indítsuk el a következő cserét
    csere(i, j, lambda: kovetkezo(db - 1)) 

# Animációt indító függvény


# Animáció hozzárendelése az onclick eseményhez


turtle.done()
